﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using AlertSystem.Business;

namespace AlertSystem.Web
{
    public partial class ucMainMenu : BaseUserControl
    {
        Hashtable _htMenu = new Hashtable(); // Hashtable chứa các menu đã được add

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                LoadData();
            }
        }

        private void LoadData()
        {
            if (UserID == null) return;
            try
            {
                _htMenu.Clear();
                List<SysMenu> menus = SysMenu.GetByUser(UserID.Value); // Lấy danh sách menu theo phân quyền cho user đang đăng nhập.
                ltrMainMenu.Text = "";
                ltrMainMenu.Text += "<ul class=\"navigation\">"; 
                for(int i = 0 ; i < menus.Count; i++)
                {
                    if (!_htMenu.ContainsKey(menus[i].MenuID)) // Nếu menu chưa add thì mới thực hiện
                    {
                        string liClass = "";
                        if (i < menus.Count - 1 && menus[i].Level.Length < menus[i + 1].Level.Length)
                        {
                            liClass = "openable"; // nếu menu có con thì class = "openable"
                        }
                        // Nội dung chính của menu:
                        ltrMainMenu.Text += string.Format(@"<li {0}><a href='{1}'><span class='isw-list'></span><span class='text'>{2}</span></a>",
                            string.IsNullOrEmpty(liClass) ? "" : "class='" + liClass + "'", ResolveUrl(menus[i].Link), menus[i].MenuName);
                        if (i < menus.Count - 1 && menus[i].Level.Length < menus[i + 1].Level.Length) // Nếu menu có con thì ...
                        {
                            // Thêm thẻ ul và gọi phương thức để add menu con:
                            ltrMainMenu.Text += "<ul>";
                            ltrMainMenu.Text += LoadSubMenu(menus, menus[i]);
                            ltrMainMenu.Text += "</ul>";
                        }
                        ltrMainMenu.Text += "</li>";
                        // -- Kết thúc nội dung chính của menu.
                        _htMenu.Add(menus[i].MenuID, menus[i]); // add menu vừa sinh code html vào Hastable
                    }
                }
                ltrMainMenu.Text += "</ul>";
            }
            catch (Exception ex)
            {
                ScriptManager.RegisterStartupScript(this, this.GetType(), "", "alert(\"" + ex.Message.Replace("\"", "'").Replace(Environment.NewLine, "") + "\");", true);
            }
        }

        private string LoadSubMenu(List<SysMenu> menuChas, SysMenu menu) // Phương thức add menu con (đệ quy). Phưng thức này cũng dùng _htMenu
        {
            string rs = "";
            List<SysMenu> menuCons = menuChas.Where(p => p.Level.StartsWith(menu.Level) && p.Level.Length > menu.Level.Length).ToList(); // Lấy ra tất cả các menu con của menu được truyền vào.
            for (int i = 0; i < menuCons.Count; i++)
            {
                if (!_htMenu.ContainsKey(menuCons[i].MenuID)) // Nếu menu chưa add thì mới thực hiện
                {
                    string liClass = "";
                    if (i < menuCons.Count - 1 && menuCons[i].Level.Length < menuCons[i + 1].Level.Length)
                    {
                        liClass = "openable"; // nếu menu có con thì class = "openable"
                    }
                    // Nội dung chính của menu:
                    rs += string.Format(@"<li {0}><a href='{1}'><span class='icon-chevron-right'></span><span class='text'>{2}</span></a>",
                        string.IsNullOrEmpty(liClass) ? "" : "class='" + liClass + "'", ResolveUrl(menuCons[i].Link), menuCons[i].MenuName);
                    if (i < menuCons.Count - 1 && menuCons[i].Level.Length > menuCons[i + 1].Level.Length) // Nếu menu có con thì ...
                    {
                        // Thêm thẻ ul và gọi phương thức để add menu con:
                        rs += "<ul>";
                        rs += LoadSubMenu(menuCons, menuCons[i]);
                        rs += "</ul>";
                    }
                    rs += "</li>";
                    // -- Kết thúc nội dung chính của menu.
                    _htMenu.Add(menuCons[i].MenuID, menuCons[i]); // add menu vừa sinh code html vào Hastable
                }
            }
            return rs;
        }
    }
}